package com.imut.lagain.service;
import org.slf4j.LoggerFactory;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.imut.lagain.entity.DataOperationLog;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 数据操作日志服务接口
 */
public interface IDataOperationLogService extends IService<DataOperationLog> {
    
    /**
     * 记录数据操作日志
     * @param userId 用户ID
     * @param operationType 操作类型
     * @param tableName 表名
     * @param recordId 记录ID
     * @param oldData 旧数据
     * @param newData 新数据
     * @param description 描述
     * @param ipAddress IP地址
     * @param userAgent 用户代理
     * @return 创建的日志
     */
    DataOperationLog logOperation(Long userId, String operationType, String tableName, 
                                 Long recordId, String oldData, String newData, 
                                 String description, String ipAddress, String userAgent);
    
    /**
     * 记录数据操作日志（简化版本）
     * @param userId 用户ID
     * @param operationType 操作类型
     * @param tableName 表名
     * @param recordId 记录ID
     * @param ipAddress IP地址
     * @param oldData 旧数据
     * @param newData 新数据
     * @return 创建的日志
     */
    DataOperationLog logOperation(Long userId, String operationType, String tableName, 
                                 Long recordId, String ipAddress, String oldData, String newData);
    
    /**
     * 根据用户ID分页查询操作日志
     * @param userId 用户ID
     * @param page 分页参数
     * @return 操作日志分页列表
     */
    IPage<DataOperationLog> getLogsByUserId(Long userId, Page<DataOperationLog> page);
    
    /**
     * 根据操作类型分页查询
     * @param operationType 操作类型
     * @param page 分页参数
     * @return 操作日志分页列表
     */
    IPage<DataOperationLog> getLogsByOperationType(String operationType, Page<DataOperationLog> page);
    
    /**
     * 根据表名分页查询
     * @param tableName 表名
     * @param page 分页参数
     * @return 操作日志分页列表
     */
    IPage<DataOperationLog> getLogsByTableName(String tableName, Page<DataOperationLog> page);
    
    /**
     * 根据记录ID查询操作日志
     * @param recordId 记录ID
     * @param page 分页参数
     * @return 操作日志分页列表
     */
    IPage<DataOperationLog> getLogsByRecordId(Long recordId, Page<DataOperationLog> page);
    
    /**
     * 根据IP地址分页查询
     * @param ipAddress IP地址
     * @param page 分页参数
     * @return 操作日志分页列表
     */
    IPage<DataOperationLog> getLogsByIpAddress(String ipAddress, Page<DataOperationLog> page);
    
    /**
     * 根据操作时间范围查询
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param page 分页参数
     * @return 操作日志分页列表
     */
    IPage<DataOperationLog> getLogsByOperationTimeBetween(LocalDateTime startTime, LocalDateTime endTime, Page<DataOperationLog> page);
    
    /**
     * 根据描述模糊查询
     * @param description 描述关键字
     * @param page 分页参数
     * @return 操作日志分页列表
     */
    IPage<DataOperationLog> searchLogsByDescription(String description, Page<DataOperationLog> page);
    
    /**
     * 统计操作次数
     * @param userId 用户ID（null表示所有用户）
     * @param operationType 操作类型（null表示所有类型）
     * @param tableName 表名（null表示所有表）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 操作次数
     */
    Long countOperations(Long userId, String operationType, String tableName, LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 统计各操作类型的数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 操作类型统计
     */
    List<Map<String, Object>> countByOperationType(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 统计各表的操作数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 表操作统计
     */
    List<Map<String, Object>> countByTableName(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 统计各用户的操作数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 用户操作统计
     */
    List<Map<String, Object>> countByUserId(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取最近的操作日志
     * @param limit 限制数量
     * @return 最近的操作日志列表
     */
    List<DataOperationLog> getRecentLogs(Integer limit);
    
    /**
     * 根据用户ID和表名查询操作日志
     * @param userId 用户ID
     * @param tableName 表名
     * @param page 分页参数
     * @return 操作日志分页列表
     */
    IPage<DataOperationLog> getLogsByUserIdAndTableName(Long userId, String tableName, Page<DataOperationLog> page);
    
    /**
     * 根据用户ID和操作类型查询操作日志
     * @param userId 用户ID
     * @param operationType 操作类型
     * @param page 分页参数
     * @return 操作日志分页列表
     */
    IPage<DataOperationLog> getLogsByUserIdAndOperationType(Long userId, String operationType, Page<DataOperationLog> page);
    
    /**
     * 根据表名和操作类型查询操作日志
     * @param tableName 表名
     * @param operationType 操作类型
     * @param page 分页参数
     * @return 操作日志分页列表
     */
    IPage<DataOperationLog> getLogsByTableNameAndOperationType(String tableName, String operationType, Page<DataOperationLog> page);
    
    /**
     * 清理过期日志
     * @param beforeTime 清理此时间之前的日志
     * @return 清理的日志数量
     */
    int cleanupOldLogs(LocalDateTime beforeTime);
    
    /**
     * 清理过期日志
     * @param days 保留天数
     * @return 清理的记录数
     */
    int cleanupExpiredLogs(int days);
    
    /**
     * 获取表操作统计
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 表操作统计列表
     */
    List<Map<String, Object>> getTableOperationStats(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取用户操作统计
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 用户操作统计列表
     */
    List<Map<String, Object>> getUserOperationStats(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 统计指定时间范围内的操作数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 操作数量
     */
    Long countOperations(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取操作类型统计
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 操作类型统计列表
     */
    List<Map<String, Object>> getOperationTypeStats(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 记录创建操作
     * @param userId 用户ID
     * @param tableName 表名
     * @param recordId 记录ID
     * @param newData 新数据
     * @param ipAddress IP地址
     * @param userAgent 用户代理
     * @return 创建的日志
     */
    DataOperationLog logCreate(Long userId, String tableName, Long recordId, String newData, String ipAddress, String userAgent);
    
    /**
     * 记录更新操作
     * @param userId 用户ID
     * @param tableName 表名
     * @param recordId 记录ID
     * @param oldData 旧数据
     * @param newData 新数据
     * @param ipAddress IP地址
     * @param userAgent 用户代理
     * @return 创建的日志
     */
    DataOperationLog logUpdate(Long userId, String tableName, Long recordId, String oldData, String newData, String ipAddress, String userAgent);
    
    /**
     * 记录删除操作
     * @param userId 用户ID
     * @param tableName 表名
     * @param recordId 记录ID
     * @param oldData 旧数据
     * @param ipAddress IP地址
     * @param userAgent 用户代理
     * @return 创建的日志
     */
    DataOperationLog logDelete(Long userId, String tableName, Long recordId, String oldData, String ipAddress, String userAgent);
    
    /**
     * 记录查询操作
     * @param userId 用户ID
     * @param tableName 表名
     * @param description 查询描述
     * @param ipAddress IP地址
     * @param userAgent 用户代理
     * @return 创建的日志
     */
    DataOperationLog logSelect(Long userId, String tableName, String description, String ipAddress, String userAgent);
    
    /**
     * 根据多个条件查询操作日志
     * @param userId 用户ID
     * @param operationType 操作类型
     * @param tableName 表名
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param page 页码
     * @param size 每页大小
     * @return 操作日志分页列表
     */
    Page<DataOperationLog> getLogsByConditions(Long userId, String operationType, String tableName, 
                                              LocalDateTime startTime, LocalDateTime endTime, 
                                              int page, int size);
}
